View Javadoc

1   /*
2    * ConfigurationToolkit.java
3    *
4    * Created on June 4, 2004, 10:51 AM
5    */
6   
7   package gov.bnl.gums;
8   
9   import java.io.IOException;
10  import java.net.URL;
11  import java.util.*;
12  import org.apache.commons.beanutils.MethodUtils;
13  import org.apache.commons.digester.*;
14  import org.apache.commons.logging.Log;
15  import org.apache.commons.logging.LogFactory;
16  import org.xml.sax.SAXException;
17  
18  /*** Contains the logic on how to parse an XML configuration file to create a
19   * correctly built Configuration object.
20   *
21   * @author  Gabriele Carcassi
22   */
23  class ConfigurationToolkit {
24      private static Log log = LogFactory.getLog(ConfigurationToolkit.class);
25      
26      static Configuration loadConfiguration(URL url) throws IOException, SAXException {
27          Digester digester = retrieveDigester();
28          Configuration conf = new Configuration();
29          digester.push(conf);
30          log.trace("Loading the configuration from url '" + url + "'");
31          return (Configuration) digester.parse(url.openStream());
32      }
33      
34      static Configuration loadConfiguration(String filename) throws IOException, SAXException {
35          Digester digester = retrieveDigester();
36          Configuration conf = new Configuration();
37          digester.push(conf);
38          log.trace("Loading the configuration from file '" + filename + "'");
39          return (Configuration) digester.parse(filename);
40      }
41      
42      static Digester retrieveDigester() {
43          Digester digester = new Digester();
44          Rule rule = new PersFactoryRule();
45          digester.setValidating(false);
46          digester.addSetProperties("gums");
47          digester.addObjectCreate("gums/persistenceFactories/persistenceFactory", "", "className");
48          digester.addSetProperties("gums/persistenceFactories/persistenceFactory");
49          Rule rule5 = new PassProperties();
50          digester.addRule("gums/persistenceFactories/persistenceFactory", rule5);
51          digester.addSetNext("gums/persistenceFactories/persistenceFactory", "addPersistenceFactory", "gov.bnl.gums.PersistenceFactory");
52  
53          digester.addObjectCreate("gums/adminUserGroup", "", "className");
54          SetPropertiesRule rule4 = new SetPropertiesRule(new String[] {"className", "persistenceFactory", "name"}, new String[]{});
55          rule4.setIgnoreMissingProperty(false);
56          digester.addRule("gums/adminUserGroup", rule4);
57          digester.addSetNext("gums/adminUserGroup", "setAdminGroup", "gov.bnl.gums.UserGroup");
58          digester.addRule("gums/adminUserGroup", rule);
59          
60          digester.addObjectCreate("gums/groupMappings/groupMapping", GroupMapper.class);
61          digester.addSetProperties("gums/groupMappings/groupMapping");
62          digester.addSetNext("gums/groupMappings/groupMapping", "addGroupMapping", "gov.bnl.gums.GroupMapper");
63          
64          digester.addObjectCreate("gums/groupMappings/groupMapping/userGroup", "", "className");
65          SetPropertiesRule rule3 = new SetPropertiesRule(new String[] {"className", "persistenceFactory", "name"}, new String[]{});
66          rule3.setIgnoreMissingProperty(false);
67          digester.addRule("gums/groupMappings/groupMapping/userGroup", rule3);
68          digester.addSetNext("gums/groupMappings/groupMapping/userGroup", "setGroup", "gov.bnl.gums.UserGroup");
69          digester.addRule("gums/groupMappings/groupMapping/userGroup", rule);
70          
71          digester.addObjectCreate("gums/groupMappings/groupMapping/accountMapping", "", "className");
72          digester.addSetProperties("gums/groupMappings/groupMapping/accountMapping");
73          digester.addSetNext("gums/groupMappings/groupMapping/accountMapping", "setMapper", "gov.bnl.gums.AccountMapper");
74          digester.addRule("gums/groupMappings/groupMapping/accountMapping", rule);
75  
76          digester.addObjectCreate("gums/groupMappings/groupMapping/compositeAccountMapping", "gov.bnl.gums.CompositeAccountMapper");
77          digester.addSetNext("gums/groupMappings/groupMapping/compositeAccountMapping", "setMapper", "gov.bnl.gums.AccountMapper");
78          
79          digester.addObjectCreate("gums/groupMappings/groupMapping/compositeAccountMapping/accountMapping", "", "className");
80          digester.addSetProperties("gums/groupMappings/groupMapping/compositeAccountMapping/accountMapping");
81          digester.addSetNext("gums/groupMappings/groupMapping/compositeAccountMapping/accountMapping", "addMapper", "gov.bnl.gums.AccountMapper");
82          digester.addRule("gums/groupMappings/groupMapping/compositeAccountMapping/accountMapping", rule);
83  
84          Rule rule2 = new GroupListRule();
85          digester.addObjectCreate("gums/hostGroups/hostGroup", "", "className");
86          digester.addSetProperties("gums/hostGroups/hostGroup");
87          digester.addSetNext("gums/hostGroups/hostGroup", "addHostGroup", "gov.bnl.gums.HostGroup");
88          digester.addRule("gums/hostGroups/hostGroup", rule2);
89          
90          return digester;
91      }
92      
93      private static  class PassProperties extends Rule {
94          
95          public void begin(String str, String str1, org.xml.sax.Attributes attributes) throws java.lang.Exception {
96                  Object factory = getDigester().peek();
97                  Properties properties = new Properties();
98                  for (int nAtt = 0; nAtt < attributes.getLength(); nAtt++) {
99                      String name = attributes.getQName(nAtt);
100                     String value = attributes.getValue(nAtt);
101                     log.trace("Adding " + name + " " + value + " propery");
102                     properties.setProperty(name, value);
103                 }
104                 MethodUtils.invokeMethod(factory, "setProperties", properties);
105         }
106         
107     }
108     
109     private static  class PersFactoryRule extends Rule {
110         
111         public void begin(String str, String str1, org.xml.sax.Attributes attributes) throws java.lang.Exception {
112             if (attributes.getValue("persistenceFactory") != null) {
113                 Configuration conf = (Configuration) getDigester().getRoot();
114                 Object mapper = getDigester().peek();
115                 MethodUtils.invokeMethod(mapper, "setPersistence", new Object[] {conf.getPersistenceFactories().get(attributes.getValue("persistenceFactory")), attributes.getValue("name")});
116             }
117         }
118         
119     }
120     
121     private static  class GroupListRule extends Rule {
122         
123         public void begin(String str, String str1, org.xml.sax.Attributes attributes) throws java.lang.Exception {
124             if (attributes.getValue("groups") != null) {
125                 Configuration conf = (Configuration) getDigester().getRoot();
126                 Object mapping = getDigester().peek();
127                 StringTokenizer tokens = new StringTokenizer(attributes.getValue("groups"), ",");
128                 List groups = new ArrayList();
129                 while (tokens.hasMoreTokens()) {
130                     String groupName = tokens.nextToken();
131                     Object group = conf.getGroupMapping().get(groupName);
132                     if (group == null) {
133                         throw new IllegalArgumentException("The groupMapping '" + groupName + "' is used within a hostGroup, but it was not defined.");
134                     }
135                     groups.add(group);
136                 }
137                 MethodUtils.invokeMethod(mapping, "setGroupMapper", new Object[] {groups});
138             }
139         }
140         
141     }
142     
143 }